package com.huoke.web.controller.system;

/**
 * @author: zhaoyongke
 * @create: 2025-09-12 16:29
 * @description: TencentSmsTemplate
 */
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 腾讯云短信服务类
 */
@Component
public class TencentSmsTemplate {

    private static final Logger logger = LoggerFactory.getLogger(TencentSmsTemplate.class);

    /**
     * 腾讯云短信SDK AppId
     */
    @Value("${tencent.sms.sdkAppId:}")
    private String sdkAppId;

    /**
     * 腾讯云密钥ID
     */
    @Value("${tencent.sms.secretId:}")
    private String secretId;

    /**
     * 腾讯云密钥Key
     */
    @Value("${tencent.sms.secretKey:}")
    private String secretKey;

    /**
     * 短信签名
     */
    @Value("${tencent.sms.signName:}")
    private String signName;

    /**
     * 地域信息
     */
    @Value("${tencent.sms.region:ap-beijing}")
    private String region;


    public String sendLoginCode(String phoneNumber, String code) {
        // 格式化手机号码为E.164标准
        String formattedPhone = formatPhoneNumber(phoneNumber);
        // 使用你的登录验证码模板ID: 2520728
        return sendSms(new String[]{formattedPhone}, "2521412", new String[]{code});
    }


    /**
     * 发送短信
     *
     * @param phoneNumbers 手机号码数组，采用 E.164 标准，格式为+[国家或地区码][手机号]
     * @param templateId   模板 ID，必须填写已审核通过的模板 ID
     * @param templateParamSet 模板参数，若无模板参数，则设置为空
     * @return 发送结果的JSON字符串
     */
    public String sendSms(String[] phoneNumbers, String templateId, String[] templateParamSet) {
        try {
            // 实例化一个认证对象
            Credential cred = new Credential(secretId, secretKey);

            // 实例化要请求产品的client对象
            SmsClient client = new SmsClient(cred, region);

            // 实例化一个请求对象
            SendSmsRequest req = new SendSmsRequest();

            // 设置请求参数
            req.setSmsSdkAppId(sdkAppId);
            req.setPhoneNumberSet(phoneNumbers);
            req.setTemplateId("2521412");
            req.setSignName(signName);
            // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
            SendSmsResponse resp = client.SendSms(req);

            // 输出json格式的字符串回包
            String result = SendSmsResponse.toJsonString(resp);
            logger.info("腾讯云短信发送结果: {}", result);
            return result;
        } catch (TencentCloudSDKException e) {
            logger.error("腾讯云短信发送异常", e);
            return null;
        }
    }

    /**
     * 发送短信验证码
     *
     * @param phoneNumber 手机号码
     * @param code 验证码
     * @return 发送结果
     */
    public String sendCode(String phoneNumber, String code) {
        // 格式化手机号码为E.164标准
        String formattedPhone = formatPhoneNumber(phoneNumber);
        return sendSms(new String[]{formattedPhone}, "1110", new String[]{code});
    }

    /**
     * 发送通知类短信
     *
     * @param phoneNumbers 手机号码数组
     * @param templateId 模板ID
     * @param params 模板参数
     * @return 发送结果
     */
    public String sendNotice(String[] phoneNumbers, String templateId, String[] params) {
        // 格式化手机号码为E.164标准
        String[] formattedPhones = new String[phoneNumbers.length];
        for (int i = 0; i < phoneNumbers.length; i++) {
            formattedPhones[i] = formatPhoneNumber(phoneNumbers[i]);
        }
        return sendSms(formattedPhones, templateId, params);
    }

    /**
     * 格式化手机号码为E.164标准
     * @param phoneNumber 手机号码
     * @return E.164标准手机号码
     */
    private String formatPhoneNumber(String phoneNumber) {
        if (phoneNumber.startsWith("+")) {
            return phoneNumber;
        } else if (phoneNumber.startsWith("00")) {
            return "+" + phoneNumber.substring(2);
        } else if (phoneNumber.startsWith("86")) {
            return "+" + phoneNumber;
        } else if (phoneNumber.length() == 11) {
            return "+86" + phoneNumber;
        } else {
            return phoneNumber;
        }
    }
}

